package ar.uade.distribuidas.tpo.dba.dao;

import java.util.LinkedList;
import java.util.List;

import ar.uade.distribuidas.tpo.base.dominiodto.EstadoItemPedido;
import ar.uade.distribuidas.tpo.dba.dominio.ItemPedido;
import ar.uade.distribuidas.tpo.dba.dominio.OrdenDePedido;
import ar.uade.distribuidas.tpo.dba.hbt.HibernateDAO;

public class OrdenDePedidoDAO extends HibernateDAO{
	
	public static OrdenDePedidoDAO instancia;
	
	private OrdenDePedidoDAO() {
		super();
	}
	
	public static OrdenDePedidoDAO getInstancia(){
		if (instancia == null){
			instancia = new OrdenDePedidoDAO();
		}
		return instancia;
	}

	@SuppressWarnings("unchecked")
	public List<ItemPedido> getItemsPedidoByEstado(EstadoItemPedido estado) {
	
		List<ItemPedido> res = new LinkedList<ItemPedido>();
        
		res = (List<ItemPedido>) this.getSession().createQuery("from ItemPedido res where res.estado = :estado")
				.setParameter("estado", estado)
				.list();
		
		return res;
		
	}

	
	@SuppressWarnings("unchecked")
	public List<ItemPedido> getItemsPedidoComprado() {
	
		List<ItemPedido> res = new LinkedList<ItemPedido>();
        
		res = (List<ItemPedido>) this.getSession().createQuery("from ItemPedido res where res.estado = :estado")
				.setParameter("estado", EstadoItemPedido.COMPRADO)
				.list();
		
		return res;
		
	}
	
	public void cambiarEstadoItem (Long id,EstadoItemPedido estadoNuevo){
		
		this.getSession().createQuery("update ItemPedido set estado = :estadoNuevo" +
				" where id = :item_id").setParameter("estadoNuevo", estadoNuevo).setParameter("item_id", id).executeUpdate();
	}

	public List<OrdenDePedido> getByCliente(long cuil) {
		@SuppressWarnings("unchecked")
		List<OrdenDePedido> odp =  (List<OrdenDePedido>)this.getSession().createQuery("from OrdenDePedido odp where odp.cliente.cuil = :cuil")
				.setParameter("cuil", cuil)
				.list();
		
		return odp;
	}
	
	public OrdenDePedido getByNumeroOrden(long numero) {
	
		OrdenDePedido odp =  (OrdenDePedido) this.getSession().createQuery("from OrdenDePedido odp where odp.numero = :num")
				.setParameter("num", numero)
				.uniqueResult();
		
		return odp;
	}
}
